/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package utilidades;

import atributos.Atributo;
import atributos.ManagerAtributos;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataInput;
import java.io.DataInputStream;
import java.io.DataOutput;
import java.io.DataOutputStream;
import java.io.EOFException;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.logging.Level;
import java.util.logging.Logger;
import vista.Inicio;

/**
 *
 * @author Eduardo
 */
public class ManejadorConexion extends Manejador {

    public ManejadorConexion() {
        super();
    }

    /**
     * Sends data over socket
     *
     * @param socket the socket
     */
    public void enviar(Socket socket, String dirShareFolder) {
        try {
            long start = System.currentTimeMillis();
            //Obtener el input stream
            InputStream in = socket.getInputStream();
            //Para recibir el id del archivo que se necesita
            DataInput dis = new DataInputStream(in);
            //1. se recibe el id del archivo
            String idFile = dis.readUTF();
            in.close();
            System.out.println("Id de Archivo a descargar: " + idFile);
//            ManagerAtributos mgerAtt = null;
//            mgerAtt = new ManagerAtributos(dirShareFolder);
//            ArrayList<Atributo> atributos = mgerAtt.Consulta(
//                    ConsultaAdvertisement.QUERY_POR_ID, idFile,null);
//            Atributo att = atributos.get(0);
            Atributo att = null;
            Iterator<Atributo> it = Inicio.recursosCompartidos.iterator();
            while(it.hasNext()){
                att = it.next();
                if(att.getId().equals(idFile))
                    break;
            }
            System.out.println("Se encontro el archivo, nombre: " + att.getNombre());
            // get the socket output stream
            OutputStream out = socket.getOutputStream();
            //Para escribir el tamaño del archivo
            DataOutput dos = new DataOutputStream(out);

            //Cargando la referencia al archivo
            //File miArchivo = new File(pathname);
            File miArchivo = att.getMyFile();

            //Creando el buffer
            byte[] out_buf = new byte[(int) miArchivo.length()];

            //2. Enviar el tamaño del archivo
            dos.writeInt(out_buf.length);
            System.out.println("Enviado tamaño archivo: " + out_buf.length);
            //3. Enviar el nombre del archivo
            dos.writeUTF(miArchivo.getName());

            //Cargando el inputstream de archivos
            FileInputStream fis = new FileInputStream(miArchivo);
            //Cargando el buffer
            BufferedInputStream bis = new BufferedInputStream(fis);
            //leyendo desde el buffer
            bis.read(out_buf, 0, out_buf.length);
            //4. Enviar el archivo
            out.write(out_buf, 0, out_buf.length);
            //cerrando las conexiones
            out.flush();
            out.close();
            socket.close();
            if(miArchivo.delete()){
                System.out.println("Se borro el archivo.");
            }
            System.out.println("Socket connection closed");
            //Calculando el tiempo de duración de la transmisión
            long finish = System.currentTimeMillis();
            long elapsed = finish - start;

            System.out.println(MessageFormat.format(
                    "EOT. Processed {0} bytes in {1} ms. Throughput = {2} KB/sec.",
                    out_buf.length, elapsed, (1000 / elapsed) * 1000 / 1024));
            synchronized (lock) {
                lock.notifyAll();
            }
        } catch (IOException io) {
            io.printStackTrace();
        }
    }

    @Override
    public void recibir(Socket socket, String pathname, String idArchivo) {

        try {
            long start = System.currentTimeMillis(); //hora del sistema
            // se obtiene el output stream
            OutputStream out = socket.getOutputStream();
            //Flujo de salida de datos java
            DataOutput dos = new DataOutputStream(out);
            //1. Se envia el id del archivo
            dos.writeUTF(idArchivo);
            out.close();
            System.out.println("Enviada petición para descargar archivo id: " + idArchivo);
            // get the socket input stream
            InputStream in = socket.getInputStream();
            //Flujo de datos de java
            DataInput dis = new DataInputStream(in);
            //2. Recibir el tamaño del archivo
            int size = dis.readInt();
            System.out.println("Recibiendo cant. de bytes a descargar: " + size);
            //3. Recibir el nombre del archivo
            String nombre = dis.readUTF();
            //Creando el buffer
            byte[] buf = new byte[size];
            //4. Recibir el archivo
            dis.readFully(buf);
            System.out.println("Archivo descargado, nombre: " + nombre);
            //Creando el outputstream
            FileOutputStream fos = new FileOutputStream(pathname + nombre);
            //creando el buffer de salida a disco
            BufferedOutputStream bos = new BufferedOutputStream(fos);
            //escribiendo en disco
            bos.write(buf, 0, size);
            //cerrando conexiones
            bos.flush();
            bos.close();
            in.close();
            socket.close();
            System.out.println("Connection closed");

            long finish = System.currentTimeMillis();
            long elapsed = finish - start;

            System.out.println(MessageFormat.format(
                    "EOT. Processed {0} bytes in {1} ms. Throughput = {2} KB/sec.",
                    size, elapsed, (1000 / elapsed) * 1000 / 1024));

        }catch(EOFException ex) {
            System.err.println("Se acabor el archivo intempestivamente");
            ex.printStackTrace();
        }
        catch (Exception ie) {
            ie.printStackTrace();
        }
    }
}
